/**
 * InsCourseUtill.java
 * com.sftj.web.coursemanage.institution.util
 * Copyright (c) 2018, 北京科技有限公司版权所有.
*/

package com.sftz.framework.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.sftz.assets.enums.CourseResourceTypeEnum;
import com.sftz.modules.minapp.coursestructure.dto.CourseStructureDto;
import com.uxuexi.core.common.util.EnumUtil;
import com.uxuexi.core.common.util.Util;

/**
 * @author   闫志彬
 * @Date	 2018年8月27日 	 
 */
public class CourseStructureUtil {

	/**
	 * 课程结构编码方式，每一级从001-999，子节点以父节点的编码为前缀；每门课程均从001开始,不同的课程之间互不影响
	 * 例如：根节点001，第一级第一个节点为001001，第二个001002，以此类推。
	 */
	public static final String BASE_CODE = "001";
	//0代表没有父节点
	public static final String NONE_ROOT = "0";
	//每一级编码的长度
	public static final int STEP = 3;

	private CourseStructureUtil() {
	}

	/**
	 * 设置课程结构的父节点id
	 * 注意:使用此方法请保证集合包含了该课程的全部节点
	 */
	public static final void resolvePid(List<CourseStructureDto> list) {
		if (!Util.isEmpty(list)) {
			Map<String, CourseStructureDto> codeMap = new HashMap<>();
			for (CourseStructureDto node : list) {
				String code = node.getCode();
				codeMap.put(code, node);
			}

			for (CourseStructureDto node : list) {
				String pcode = pcode(node.getCode());
				CourseStructureDto pNode = codeMap.get(pcode);
				if (Util.isEmpty(pNode)) {
					node.setPId(0);
				} else {
					node.setPId(pNode.getId());
				}
			}
		}
	}

	/**
	 *  根据resourceType 获取资源类型名称
	 */
	public static final void resolveTypeName(List<CourseStructureDto> list) {
		if (!Util.isEmpty(list)) {
			for (CourseStructureDto node : list) {
				Integer resourceType = node.getResourceType();
				if (!Util.isEmpty(resourceType)) {
					CourseResourceTypeEnum ct = EnumUtil.get(CourseResourceTypeEnum.class, resourceType);
					switch (ct) {
					case VIDEO:
						node.setResourceTypeName(CourseResourceTypeEnum.VIDEO.value());
						break;
					case AUDIO:
						node.setResourceTypeName(CourseResourceTypeEnum.AUDIO.value());
						break;
					case FILE: //文件
						node.setResourceTypeName(CourseResourceTypeEnum.FILE.value());
						break;
					case MIND: //导图
						node.setResourceTypeName(CourseResourceTypeEnum.MIND.value());
						break;
					case LINK: //链接
						node.setResourceTypeName(CourseResourceTypeEnum.LINK.value());
						break;
					case IMAGE_TEXT: //图文
						node.setResourceTypeName(CourseResourceTypeEnum.IMAGE_TEXT.value());
						break;
					case DOWNLOAD_TEXT: //图文
						node.setResourceTypeName(CourseResourceTypeEnum.DOWNLOAD_TEXT.value());
						break;
					case HOMEWORK: //图文
						node.setResourceTypeName(CourseResourceTypeEnum.HOMEWORK.value());
						break;
					case DISCUSS: //图文
						node.setResourceTypeName(CourseResourceTypeEnum.DISCUSS.value());
						break;
					default:
						break;
					}
				}
			}
		}
	}

	/**
	 * 
	 * 查询节点的所有父节点
	 * <p>
	 * @param allNode 所有节点
	 * @param code    查找节点的code值
	 */
	public static List<CourseStructureDto> findParents(List<CourseStructureDto> allNode, String code) {
		List<CourseStructureDto> re = new ArrayList<>();
		if (!Util.isEmpty(code)) {
			if (!Util.isEmpty(allNode)) {
				for (CourseStructureDto node : allNode) {
					String key = node.getCode();
					if (code.startsWith(key)) {
						re.add(node);
					}
				}
			}
		}
		return re;
	}

	/**
	 * 
	 * 查询节点的所有子节点
	 * <p>
	 * @param allNode 所有节点
	 * @param code    查找节点的code值
	 */
	public static List<CourseStructureDto> findChildren(List<CourseStructureDto> allNode, String code) {
		List<CourseStructureDto> re = new ArrayList<>();
		if (!Util.isEmpty(code)) {
			if (!Util.isEmpty(allNode)) {
				for (CourseStructureDto node : allNode) {
					String key = node.getCode();
					if (!Util.isEmpty(key) && key.startsWith(code)) {
						re.add(node);
					}
				}
			}
		}
		return re;
	}

	/**
	 * 获取直接父节点的编码
	 */
	public static final String pcode(String code) {
		if (!Util.isEmpty(code) && code.length() > STEP) {
			return code.substring(0, code.length() - STEP);
		}
		return NONE_ROOT;
	}

	/**
	 * 获取所有父节点的编码
	 */
	public static final List<String> pcodeAll(String code) {
		List<String> re = new ArrayList<>();
		findPcode(re, code);
		return re;
	}

	private static void findPcode(List<String> lst, String code) {
		if (NONE_ROOT.equals(code)) {
			return;
		}
		String pcode = pcode(code);
		lst.add(pcode);
		findPcode(lst, pcode);
	}
}
